// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.jetbrains.python.numpy.codeInsight

import com.google.common.collect.ImmutableMap
import com.intellij.psi.PsiElement
import com.jetbrains.python.documentation.PythonDocumentationLinkProvider
import com.jetbrains.python.documentation.PythonDocumentationMap
import com.jetbrains.python.documentation.PythonDocumentationProvider
import java.io.BufferedReader
import java.io.IOException
import java.io.InputStreamReader


class SciPyDocumentationLinkProvider : PythonDocumentationLinkProvider {

  private val nameToWebpageName: Map<String, String> by lazy {
    val b = ImmutableMap.builder<String, String>()
    try {
      BufferedReader(
        InputStreamReader(
          SciPyDocumentationLinkProvider::class.java
            .getResourceAsStream("/com/jetbrains/python/numpy/codeInsight/scipyNameMapping.tsv"), // generated by scipy_doc_mapping.py
          Charsets.UTF_8
        )
      ).use { inputStream ->
        inputStream.lines().forEach { line ->
          val kv = line.split("\t".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
          b.put(kv[0], kv[1])
        }
      }
    }
    catch (e: IOException) {
      throw RuntimeException(e)
    }

    b.build()
  }

  override fun getExternalDocumentationUrl(element: PsiElement?, originalElement: PsiElement?): String? {
    val qname = PythonDocumentationProvider.getFullQualifiedName(element)

    return if (qname != null && qname.firstComponent in listOf("numpy", "scipy") &&
               !PythonDocumentationMap.getInstance().entries.containsKey(qname.firstComponent)) {
      val webPage = nameToWebpageName.get(qname.toString())
      if (webPage != null) {
        "https://docs.scipy.org/doc/${qname.firstComponent}/reference/generated/$webPage.html"
      } else {
        "https://docs.scipy.org/doc/${qname.firstComponent}/reference/"
      }
    }
    else null

  }

}